grammar Clr;

prog // 根节点
:
	stat+ EOF //EOF结束符号匹配
;

stat : expr             # printExpr  // #号结尾会生成对应的名字的方法名，来替代该节点的原来名字，类似于重命名
     | ID '=' expr      # assign
     | 'print(' ID ')'  # print
     ;

expr :
    expr op=(MUL|DIV) expr   # MulDiv
     | expr op=(ADD|SUB) expr   # AddSub
     | sign=(ADD|SUB)?NUMBER    # number
     | ID                       # id
     | '(' expr ')'             # parens
     ;

ID   : [a-zA-Z]+;
NUMBER  : [0-9]+('.'([0-9]+)?)? | [0-9]+;
MUL  : '*';
DIV  : '/';
ADD  : '+';
SUB  : '-';
